package com.pktechan.api.base;

import com.pktechan.api.utils.JedisPoolUtils;
import redis.clients.jedis.Jedis;

import java.util.Map;
import java.util.Set;

/**
 * Created by qx.zhangbj02320 on 2017/11/13.
 */
public class BaseRedisServiceImpl {

    /**
     * 将字符串保存到redis中
     *
     * @param key
     * @param value
     * @return 成功 OK
     */
    protected String set(String key, String value) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.set(key, value);
        } finally {
            //使用结束后要释放jedis资源
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 获取指定的值
     *
     * @param key redis中值的键
     * @return
     */
    protected String get(String key) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.get(key);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 追加字符串
     *
     * @param key
     * @param value
     * @return
     */
    protected long append(String key, String value) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.append(key, value);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 判断指定的键是否存在
     *
     * @param key
     * @return true-存在，false-不存在
     */
    protected boolean exists(String key) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.exists(key);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 删除指定的键，
     *
     * @param key
     * @return 0表示指定的键不存在， 大于0表示删除一个或多个。
     */
    protected long del(String key) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.del(key);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 将Map保存到redis中
     *
     * @param key
     * @param value
     * @return
     */
    protected String setMap(String key, Map<String, String> value) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.hmset(key, value);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 向已有Map中添加键值对
     *
     * @param key   Map的key
     * @param field map集合中的key
     * @param value map集合中的value
     * @return 0-更新   1-创建
     */
    protected long setMapValue(String key, String field, String value) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.hset(key, field, value);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 获取redis中的Map
     *
     * @param key
     * @return
     */
    protected Map<String, String> getMap(String key) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.hgetAll(key);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 获取指定Map中的某键对应的值
     *
     * @param key   Map对应的key值
     * @param field Map中键值对中的键
     * @return
     */
    protected String getMapValue(String key, String field) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.hget(key, field);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 删除已有Map中的键值对
     *
     * @param key
     * @param fields
     * @return
     */
    protected long delMapValues(String key, String... fields) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.hdel(key, fields);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 删除Map
     *
     * @param key
     * @return
     */
    protected long delMap(String key) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.del(key);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 设置键的超时时间
     *
     * @param key     键
     * @param seconds 秒
     * @return
     */
    protected long setExpire(String key, int seconds) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.expire(key, seconds);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 向集合中添加元素
     *
     * @param key
     * @param members
     * @return
     */
    protected long setList(String key, String... members) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.sadd(key, members);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 取出集合中所有的元素
     *
     * @param key
     * @return
     */
    protected Set<String> getList(String key) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.smembers(key);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

    /**
     * 移除集合中指定元素
     *
     * @param key
     * @param members
     * @return
     */
    protected long delList(String key, String... members) {
        Jedis jedis = JedisPoolUtils.getJedis();
        try {
            return jedis.srem(key, members);
        } finally {
            JedisPoolUtils.returnResource(jedis);
        }
    }

}
